Kubeconfig 文件解释、配置示例
概述
在这篇博客中,您将学习如何使用 Kubeconfig 文件使用不同的方法连接到 kubernetes 集群。此外,您将学习生成自定义 Kubeconfig 文件。
什么是 Kubeconfig 文件?
Kubeconfig 是一个 YAML 文件,其中包含所有 Kubernetes 集群详细信息、证书和用于验证集群的秘密令牌。如果您使用的是托管 Kubernetes 集群,则可以直接从群集管理员或云平台获取此配置文件。
A Kubeconfig is a YAML file with all the Kubernetes cluster details, certificate, and secret token to authenticate the cluster.
当你使用 时,它会使用 kubeconfig 文件中的信息来连接到 kubernetes 集群 API。Kubeconfig 文件的默认位置是kubectl $HOME/.kube/config
示例 Kubeconfig 文件
下面是一个 Kubeconfig 的示例。它需要以下关键信息才能连接到 Kubernetes 集群。
- certificate-authority-data: Cluster CA
- server: Cluster endpoint (IP/DNS of master node)
- name: Cluster name
- user: name of the user/service account.
- token: Secret token of the user/service account.
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: <ca-data-here>
server: https://your-k8s-cluster.com
name: <cluster-name>
contexts:
- context:
cluster: <cluster-name>
user: <cluster-name-user>
name: <cluster-name>
current-context: <cluster-name>
kind: Config
preferences: {}
users:
- name: <cluster-name-user>
user:
token: <secret-token-here>
Different Methods to Connect Kubernetes Cluster With Kubeconfig File
你可以用不同的方式使用 Kubeconfig,每种方式都有自己的优先级。这是顺序的优先级。
- Kubectl 上下文:Kubeconfig with kubectl 会覆盖所有其他配置。它具有最高的优先级。
- 环境变量:KUBECONFIG env 变量覆盖当前上下文。
- 命令行参考: 当前上下文的优先级低于内联配置引用和 env 变量。
方法 1:使用 kubeconfig kubectl 上下文连接到 Kubernetes 集群
要连接到 Kubernetes 集群,基本的先决条件是 Kubectl CLI 插件。如果您没有安装 CLI,请按照[此处给出的说明](在 Linux 系统中安装并设置 kubectl | Kubernetes)进行操作
现在按照下面给出的步骤使用 kubeconfig 文件与集群进行交互。
步骤1:将 kubeconfig 移动到 .kube 目录。
Kubectl 使用 Kubeconfig 文件中提供的详细信息与 kubernetes 集群进行交互。默认情况下,kubectl 在该位置查找配置文件。~/.kube
让我们将 kubeconfig 文件移动到 .kube 目录。替换为您的 kubeconfig 当前路径。/path/to/kubeconfig
mv /path/to/kubeconfig ~/.kube
步骤 2:列出所有群集上下文
您可以在目录中拥有任意数量的 kubeconfig。每个配置都有一个唯一的上下文名称(即集群的名称)。您可以通过列出上下文来验证 Kubeconfig 文件。您可以使用以下命令列出所有上下文。它将上下文名称列为群集的名称。.kube
kubectl config get-contexts
步骤 3:设置当前上下文
现在你需要将当前上下文设置为你的 kubeconfig 文件。您可以使用以下命令进行设置。替换为列出的上下文名称。<cluster-name>
kubectl config use-context <cluster-name>
例如:
kubectl config use-context my-dev-cluster
步骤 4:验证 Kubernetes 群集连接
要验证集群连接,您可以执行以下 kubectl 命令来列出集群节点。
kubectl get nodes
方式二:连接 KUBECONFIG 环境变量
您可以使用文件路径设置环境变量以连接到集群。因此,无论您在终端中使用 kubectl 命令的哪个位置,env 变量都应该可用。如果设置此变量,它将覆盖当前群集上下文。KUBECONFIG kubeconfig KUBECONFIG
您可以使用以下命令设置变量。文件名在哪里。dev_cluster_config kubeconfig
KUBECONFIG=$HOME/.kube/dev_cluster_config
方法 3:使用 kubeconfig 文件和 kubectl
你可以使用 Kubectl 命令传递 Kubeconfig 文件,以覆盖当前上下文和 KUBECONFIG env 变量。
下面是获取节点的示例。
kubectl get nodes --kubeconfig=$HOME/.kube/dev_cluster_config
你也可以使用,
KUBECONFIG=$HOME/.kube/dev_cluster_config kubectl get nodes
合并多个 kubeconfig 文件
可以使用支持的 kubectl 命令将其他 Kubeconfig 文件合并到默认文件中。$HOME/.kube/config
假设在目录$HOME/.kube/
中有三个 Kubeconfig 文件。
- config (default kubeconfig)
- dev_config
- test_config
使用以下命令将所有三个配置合并到一个文件中。确保在 $HOME/.kube
目录运行命令
KUBECONFIG=config:dev_config:test_config kubectl config view --merge --flatten > config.new
上面的命令创建一个名为 的合并配置。config.new
现在重命名文件。$HOME.kube/config
mv $HOME/.kube/config $HOME/.kube/config.old
mv $HOME/.kube/config.new $HOME/.kube/config
要验证配置,请尝试列出配置中的上下文。
kubectl config get-contexts
生成 kubeconfig 文件?
一个 kubeconfig 需要以下重要的细节。
- Cluster endpoint (IP or DNS name of the cluster)
- Cluster CA Certificate
- Cluster name
- Service account user name
- Service account token
注意:要生成 Kubeconfig 文件,您需要在集群中拥有管理员权限才能创建服务账号和角色。
我将创建一个对群集范围资源具有有限访问权限的服务帐户。也可以创建一个普通角色,以限制用户对特定命名空间的访问。
创建 serviceaccount
serviceaccount
名称将是 Kubeconfig 中的用户名。如果要创建配置以授予命名空间级别受限的访问权限,请在所需的命名空间中创建 serviceaccount
。
kubectl -n kube-system create serviceaccount devops-cluster-admin
创建 ClusterRole
创建一个对群集对象具有有限权限的 ClusterRole
。可以根据需要添加所需 resources
。有关详细信息,请参阅具有群集角色访问的服务帐户博客。clusterRole
如果要创建命名空间范围的 Role
,请参阅使用角色创建服务帐户。
执行以下命令创 ClusterRole
。
cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: devops-cluster-admin
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/proxy
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups:
- extensions
resources:
- ingresses
verbs: ["get", "list", "watch"]
EOF
## apiGroups: "","apps", "autoscaling", "batch", kubectl api-versions
## resources: "services", "pods","deployments"... kubectl api-resources
## verbs: "get", "list", "watch", "create", "update", "patch", "delete", "exec"
创建 ClusterRoleBinding
执行以下命令创建名为devops-cluster-admin
的ClusterRoleBinding
,将 ClusterRole
绑定到 ServiceAccount
。
如果需要针对不同的 namespace 划分不同的权限,可以创建多个 ClusterRole,在对应的 Namespace 中创建单独的 RoleBinding 绑定 ClusterRoleBinding 和 ServiceAccount
cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: devops-cluster-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: devops-cluster-admin
subjects:
- kind: ServiceAccount
name: devops-cluster-admin
namespace: kube-system
EOF
获取群集详细信息和密钥
检索所有必需的 kubeconfig 信息并将它们保存在变量中。最后,我们将它直接替换为 Kubeconfig YAML。
export SA_TOKEN_NAME=$(kubectl -n kube-system get serviceaccount devops-cluster-admin -o=jsonpath='{.secrets[0].name}')
export SA_SECRET_TOKEN=$(kubectl -n kube-system get secret/${SA_TOKEN_NAME} -o=go-template='{{.data.token}}' | base64 --decode)
export CLUSTER_NAME=$(kubectl config current-context)
export CURRENT_CLUSTER=$(kubectl config view --raw -o=go-template='{{range .contexts}}{{if eq .name "'''${CLUSTER_NAME}'''"}}{{ index .context "cluster" }}{{end}}{{end}}')
export CLUSTER_CA_CERT=$(kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}"{{with index .cluster "certificate-authority-data" }}{{.}}{{end}}"{{ end }}{{ end }}')
export CLUSTER_ENDPOINT=$(kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}{{ .cluster.server }}{{end}}{{ end }}')
使用变量生成 kubeconfig。
执行以下命令,生成 kubeconfig devops-cluster-admin-config
cat << EOF > devops-cluster-admin-config
apiVersion: v1
kind: Config
current-context: ${CLUSTER_NAME}
contexts:
- name: ${CLUSTER_NAME}
context:
cluster: ${CLUSTER_NAME}
user: devops-cluster-admin
clusters:
- name: ${CLUSTER_NAME}
cluster:
certificate-authority-data: ${CLUSTER_CA_CERT}
server: ${CLUSTER_ENDPOINT}
users:
- name: devops-cluster-admin
user:
token: ${SA_SECRET_TOKEN}
EOF
验证生成的 Kubeconfig
执行以下命令验证生成的 Kubeconfig。
kubectl get nodes --kubeconfig=devops-cluster-admin-config